/**
 *  CsvParser.h
 *
 * Copyright (c) 2011, Anders Karlsson
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the 
 * following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following 
 * disclaimer in the documentation and/or other materials provided with the distribution.
 * The name of the contributor may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 
 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 * THE POSSIBILITY OF SUCH DAMAGE. 
 */

class CsvParser
{
public:
	typedef std::map<int,char*> fileMap_t;
	
	CsvParser(std::string fullPath);
	~CsvParser();

	fileMap_t& parseCSV(); ///! main function, use index r*_cols+c to retrieve m[r,c] 
	
	size_t rows() const;
	size_t cols() const;
	size_t emptyRows() const;
	
	char* token( size_t row, size_t col ); ///! can be used to access tokens once parseCSV has been called.
	
	void dump();
protected:
	void determineRowsAndCols( const char* fileBuffer, const size_t length );
	bool readFile();
	
	size_t _rows;
	size_t _cols;
	size_t _emptyRows;
	size_t _fileLength; 
	std::auto_ptr<char> _fileBuffer; 
	fileMap_t _csvFile;
	std::string _fullPath;
};

